package top.blueShark.template.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;

import top.blueShark.template.entity.SysMenu;
import top.blueShark.template.entity.SysRole;
import top.blueShark.template.service.SysMenuService;
import top.blueShark.template.service.SysRoleService;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 菜单相关的真实接口控制器，从数据库获取菜单数据
 */
@RestController
@RequestMapping("/api/menu")
public class MenuController {

    private static final Logger logger = LoggerFactory.getLogger(MenuController.class);

    @Resource
    private SysMenuService sysMenuService;

    @Resource
    private SysRoleService sysRoleService;

    /**
     * 获取所有菜单数据（真实接口）
     *
     * @return 所有菜单数据
     * List<String> userRoles
     */
    @GetMapping("/all")
    public Map<String, Object> getAllMenus(@RequestParam(value = "userRoles",defaultValue = "admin") List<String> userRoles) {
        logger.info("获取所有菜单数据（真实接口）");
        //TODO 根据用户角色设置一级菜单数据
        // 根据 roleName 查询 roleId
        List<String> userRoleIds = new ArrayList<>();
        userRoles.forEach(userRole -> {
            SysRole sysRole = sysRoleService.getByRoleName(userRole);
            userRoleIds.add(sysRole.getId());
        });
        List<SysMenu> sysMenuList = null;
        if (!(userRoleIds.isEmpty()) && userRoles.contains("admin")){
            sysMenuList = sysMenuService.getMenuTree();
        } else if (!(userRoleIds.isEmpty()) && !userRoles.contains("admin")) {
            logger.info("查询用户角色的菜单");
            sysMenuList = sysMenuService.getRoleMenuTree(userRoleIds);

        }
        List<Map<String, Object>> resultMenus = new ArrayList<>();

        ObjectMapper objectMapper = new ObjectMapper();
        // 获取子集菜单 根据用户角色获取有权限的菜单
        for (SysMenu sysMenu : sysMenuList) {
            resultMenus.add(convertSysMenuToMap(sysMenu, objectMapper));
        }

        Map<String, Object> result = new HashMap<>();
        result.put("code", 0);

        result.put("data", resultMenus);
        result.put("error", null);
        result.put("message", "ok");
        return result;
    }

    /**
     * 将 SysMenu 对象转换为 Map，并处理嵌套的子菜单
     */
    private Map<String, Object> convertSysMenuToMap(SysMenu sysMenu, ObjectMapper objectMapper) {
        Map<String, Object> menuMap = new HashMap<>();
        menuMap.put("name", sysMenu.getName());
        menuMap.put("path", sysMenu.getPath());
        menuMap.put("component", sysMenu.getComponent());
        // 根据需要处理redirect，如果SysMenu中有redirect字段
        // menuMap.put("redirect", sysMenu.getRedirect());

        // 解析 meta_json 字段
        if (sysMenu.getMetaJson() != null && !sysMenu.getMetaJson().isEmpty()) {
            try {
                Map<String, Object> meta = objectMapper.readValue(sysMenu.getMetaJson(), new TypeReference<Map<String, Object>>() {
                });

                // 如果meta中包含redirect，则将其提升到顶层
                if (meta.containsKey("redirect")) {
                    menuMap.put("redirect", meta.remove("redirect"));
                }
                // 如果meta中包含icon，且SysMenu没有独立的getIcon方法，可以考虑从meta中获取
                // 这里假设icon在meta_json中，并且需要作为meta的一部分
                // 也可以根据实际情况，将sysMenu.getIcon()放入meta，如果icon是独立字段的话
                if (sysMenu.getIcon() != null && !sysMenu.getIcon().isEmpty()) {
                    meta.put("icon", sysMenu.getIcon());
                }
                menuMap.put("meta", meta);
            } catch (Exception e) {
                logger.error("解析 meta_json 失败: {}", sysMenu.getMetaJson(), e);
            }
        }

        // 处理子菜单
        if (sysMenu.getChildren() != null && !sysMenu.getChildren().isEmpty()) {
            List<Map<String, Object>> childrenMaps = new ArrayList<>();
            for (SysMenu child : sysMenu.getChildren()) {
                childrenMaps.add(convertSysMenuToMap(child, objectMapper));
            }
            menuMap.put("children", childrenMaps);
        }
        return menuMap;
    }

} 